package testes;

import static org.junit.Assert.*;


import java.util.HashSet;
import java.util.Set;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.quasar.copaPaises.businessLayer.*;

public class CampeonatoTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {
		 CalendarDate.allInstances.clear();
		  Campeonato.allInstances.clear();
		  Cartao.allInstances.clear();
		  Cidade.allInstances.clear();
		  Clube.allInstances.clear();
		  Continente.allInstances.clear();
		  Equipa.allInstances.clear();
		  Estadio.allInstances.clear();
		  Golo.allInstances.clear();
		  Grupo.allInstances.clear();
		  Jogador.allInstances.clear();
		  Jogo.allInstances.clear();
		  Membro.allInstances.clear();
		  Pais.allInstances.clear();
		  Participacao.allInstances.clear();
		  Participante.allInstances().clear();
		  Treinador.allInstances.clear();
	}

	@After
	public void tearDown() throws Exception {
		 CalendarDate.allInstances.clear();
		  Campeonato.allInstances.clear();
		  Cartao.allInstances.clear();
		  Cidade.allInstances.clear();
		  Clube.allInstances.clear();
		  Continente.allInstances.clear();
		  Equipa.allInstances.clear();
		  Estadio.allInstances.clear();
		  Golo.allInstances.clear();
		  Grupo.allInstances.clear();
		  Jogador.allInstances.clear();
		  Jogo.allInstances.clear();
		  Membro.allInstances.clear();
		  Pais.allInstances.clear();
		  Participacao.allInstances.clear();
		  Participante.allInstances().clear();
		  Treinador.allInstances.clear();
	}

	@Test
	public final void testCampeonato() {
		Campeonato campeonato = new Campeonato();
		assertNotNull(campeonato);
	}

	@Test
	public final void testCampeonatoTipoCampeonatoStringInt() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		 Campeonato c = new Campeonato(tipo, "LoL", 32);
		 assertNotNull(c);
	}

	@Test
	public final void testGenero() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		 Campeonato c = new Campeonato(tipo, "LoL", 32);
		 assertTrue(c.genero() == TipoCampeonato.Europeu || c.genero() == TipoCampeonato.Mundial );
	}

	@Test
	public final void testSetGenero() {
		Campeonato c = new Campeonato();
		c.setGenero(TipoCampeonato.Europeu);
		assertNotNull(c.genero());
	}

	@Test
	public final void testNome() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		 Campeonato c = new Campeonato(tipo, "LoL", 32);
		 assertTrue(c.nome().equals("LoL"));
	}

	@Test
	public final void testSetNome() {
		Campeonato c = new Campeonato();
		c.setNome("LoL");
		assertNotNull(c.nome());
	}

	@Test
	public final void testNumPaises() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		 Campeonato c = new Campeonato(tipo, "LoL", 32);
		 assertTrue(c.numPaises()== 32);
	}

	@Test
	public final void testSetNumPaises() {
		Campeonato c = new Campeonato();
		c.setNumPaises(64);
		assertTrue(c.numPaises() == 64);
	}

	@Test
	public final void testGrupos() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		 Campeonato c = new Campeonato(tipo, "LoL", 32);
		Grupo g1 = new Grupo();
		Grupo g2 = new Grupo();
		g1.setCampeonato(c);
		g2.setCampeonato(c);
		assertTrue(c.grupos().size() == 2);
	}

	@Test
	public final void testSetGrupos() {
		TipoCampeonato tipo = TipoCampeonato.Mundial;
		Campeonato c = new Campeonato(tipo, "LoL", 32);
		Grupo g1 = new Grupo();
		Grupo g2 = new Grupo();
		HashSet<Grupo> grupos = new HashSet<Grupo>();
		grupos.add(g1);
		grupos.add(g2);
		c.setGrupos(grupos);
		assertTrue(c.grupos().size()==2);
	}

	@Test
	public final void testParticipacao() {
		Campeonato c = new Campeonato();
		Participacao p1 = new Participacao();
		Participacao p2 = new Participacao();
		HashSet<Participacao> participacoes = new HashSet<Participacao>();
		participacoes.add(p1);
		participacoes.add(p2);
		c.setParticipacao(participacoes);
		assertTrue(c.participacao().size()==2);
		assertEquals(c.participacao(),participacoes);
	}

	@Test
	public final void testSetParticipacao() {
		Campeonato c = new Campeonato();
		Participacao p1 = new Participacao();
		Participacao p2 = new Participacao();
		HashSet<Participacao> participacoes = new HashSet<Participacao>();
		participacoes.add(p1);
		participacoes.add(p2);
		c.setParticipacao(participacoes);
		assertTrue(c.participacao().size()==2);
		assertEquals(c.participacao(),participacoes);
	}

	@Test
	public final void testParticipante() {
		Campeonato c = new Campeonato();
		Pais p1 = new Pais();
		Pais p2 = new Pais();
		HashSet<Pais> paises = new HashSet<Pais>();
		paises.add(p1);
		paises.add(p2);
		c.setParticipante(paises);
		assertTrue(c.participante().size() == 2);
		assertEquals(c.participante(),paises);
	}

	@Test
	public final void testSetParticipante() {
		Campeonato c = new Campeonato();
		Pais p1 = new Pais();
		Pais p2 = new Pais();
		HashSet<Pais> paises = new HashSet<Pais>();
		paises.add(p1);
		paises.add(p2);
		c.setParticipante(paises);
		assertTrue(c.participante().size() == 2);
		assertEquals(c.participante(),paises);
	}

	@Test
	public final void testActualizaNumPaises() {
		int numPaises = 4;
		Campeonato c = new Campeonato(null,null,numPaises);
		c.actualizaNumPaises();
		assertEquals(c.numPaises(),numPaises+1);
		
	}

	@Test
	public final void testAdicionaPais() {
		Participacao.allInstances.clear();
		
		
		Campeonato c = new Campeonato();
		Pais p1 = new Pais();
		Pais p2 = new Pais();
		HashSet<Pais> paises = new HashSet<Pais>();
		paises.add(p1);
		paises.add(p2);
		c.setParticipante(paises);
		Pais p3 = new Pais();
		c.adicionaPais(p3);
		assertTrue(c.participante().contains(p3));
		assertEquals(c.participante().size(),3);
	}

	/**@Test
	public final void testCriaMembrosEquipas() {
		fail("Not yet implemented"); 
	}*/

	@Test
	public final void testMaxGolos() {
		
		Jogador j1 = new Jogador();
		Jogador j2 = new Jogador();
		Membro m1 = new Membro();
		Membro m2 = new Membro();
		HashSet<Golo> g1 = new HashSet<Golo>();
		HashSet<Golo> g2 = new HashSet<Golo>();
		Golo golo1 = new Golo();
		Golo golo2 = new Golo();
		Golo golo3 = new Golo();
		Golo golo4 = new Golo();
		Golo golo5 = new Golo();
		g1.add(golo1);
		g1.add(golo2);
		g2.add(golo3);
		g2.add(golo4);
		g2.add(golo5);
		m1.setGolos(g1);
		m1.setJogador(j1);
		m2.setGolos(g2);
		m2.setJogador(j2);
		HashSet<Membro> membros1 = new HashSet<Membro>();
		HashSet<Membro> membros2 = new HashSet<Membro>();
		membros1.add(m1);
		membros2.add(m2);
		j1.setMembro(membros1);
		j2.setMembro(membros2);
		HashSet<Jogador> jogadores = new HashSet<Jogador>();
		jogadores.add(j1);
		jogadores.add(j2);
		Campeonato c = new Campeonato();
		Participacao p = new Participacao();
		p.setPlantel(jogadores);
		HashSet<Participacao> participacao = new HashSet<Participacao>();
		participacao.add(p);
		c.setParticipacao(participacao);
		assertEquals(c.maxGolos(),3);
	}

	@Test
	public final void testMelhorMarcador() {
		Jogador j1 = new Jogador();
		Jogador j2 = new Jogador();
		j1.setNome("joao");
		j2.setNome("canario");
		Membro m1 = new Membro();
		Membro m2 = new Membro();
		HashSet<Golo> g1 = new HashSet<Golo>();
		HashSet<Golo> g2 = new HashSet<Golo>();
		Golo golo1 = new Golo();
		Golo golo2 = new Golo();
		Golo golo3 = new Golo();
		Golo golo4 = new Golo();
		Golo golo5 = new Golo();
		g1.add(golo1);
		g1.add(golo2);
		g2.add(golo3);
		g2.add(golo4);
		g2.add(golo5);
		m1.setGolos(g1);
		m1.setJogador(j1);
		m2.setGolos(g2);
		m2.setJogador(j2);
		HashSet<Membro> membros1 = new HashSet<Membro>();
		HashSet<Membro> membros2 = new HashSet<Membro>();
		membros1.add(m1);
		membros2.add(m2);
		j1.setMembro(membros1);
		j2.setMembro(membros2);
		HashSet<Jogador> jogadores = new HashSet<Jogador>();
		jogadores.add(j1);
		jogadores.add(j2);
		Campeonato c = new Campeonato();
		Participacao p = new Participacao();
		p.setPlantel(jogadores);
		HashSet<Participacao> participacao = new HashSet<Participacao>();
		participacao.add(p);
		c.setParticipacao(participacao);
		assertEquals(c.melhorMarcador(),j2);
	}

	@Test
	public final void testToString() {
		Campeonato c = new Campeonato();
		String toString = "Campeonato [genero=null, nome=null, numPaises=0]\n";
		assertEquals(c.toString(),toString);
	}

}
